package cn.iocoder.yudao.module.system.service.scorelineconfig;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.scorelineconfig.vo.ScoreLineConfigPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.scorelineconfig.vo.ScoreLineConfigSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.scorelineconfig.ScoreLineConfigDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 分数线配置 Service 接口
 *
 * @author 芋道源码
 */
public interface ScoreLineConfigService {

    /**
     * 创建分数线配置
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createScoreLineConfig(@Valid ScoreLineConfigSaveReqVO createReqVO);

    /**
     * 更新分数线配置
     *
     * @param updateReqVO 更新信息
     */
    void updateScoreLineConfig(@Valid ScoreLineConfigSaveReqVO updateReqVO);

    /**
     * 删除分数线配置
     *
     * @param id 编号
     */
    void deleteScoreLineConfig(Long id);

    /**
     * 获得分数线配置
     *
     * @param id 编号
     * @return 分数线配置
     */
    ScoreLineConfigDO getScoreLineConfig(Long id);

    /**
     * 获得分数线配置分页
     *
     * @param pageReqVO 分页查询
     * @return 分数线配置分页
     */
    PageResult<ScoreLineConfigDO> getScoreLineConfigPage(ScoreLineConfigPageReqVO pageReqVO);

    /**
     * 根据配置键值、科目类型、省份和年份获取分数线
     *
     * @param configKey 配置键值
     * @param subjectType 科目类型
     * @param province 省份
     * @param year 年份
     * @return 分数值
     */
    Integer getScoreByConfigKeyAndSubjectTypeAndProvinceAndYear(String configKey, String subjectType, String province, Integer year);

    /**
     * 根据配置键值和科目类型获取分数线（兼容旧方法，使用默认省份和年份）
     *
     * @param configKey 配置键值
     * @param subjectType 科目类型
     * @return 分数值
     */
    Integer getScoreByConfigKeyAndSubjectType(String configKey, String subjectType);

    /**
     * 根据科目类型、省份和年份获取所有分数线配置
     *
     * @param subjectType 科目类型
     * @param province 省份
     * @param year 年份
     * @return 分数线配置列表
     */
    List<ScoreLineConfigDO> getScoreLinesBySubjectTypeAndProvinceAndYear(String subjectType, String province, Integer year);

    /**
     * 根据科目类型获取所有分数线配置（兼容旧方法，使用默认省份和年份）
     *
     * @param subjectType 科目类型
     * @return 分数线配置列表
     */
    List<ScoreLineConfigDO> getScoreLinesBySubjectType(String subjectType);

    /**
     * 获取所有启用的分数线配置，按配置类型分组
     *
     * @return 分数线配置Map，key为配置类型，value为分数线配置列表
     */
    Map<String, List<ScoreLineConfigDO>> getAllEnabledScoreLinesGroupByType();

    /**
     * 根据配置类型获取分数线配置
     *
     * @param configType 配置类型
     * @return 分数线配置列表
     */
    List<ScoreLineConfigDO> getScoreLinesByConfigType(String configType);

    /**
     * 根据配置类型和科目类型获取分数线分值
     *
     * @param configType 配置类型
     * @param subjectType 科目类型
     * @return 分数值
     */
    Integer getScoreByConfigType(String configType, String subjectType);

    /**
     * 根据配置类型、科目类型、省份和年份获取分数线分值
     *
     * @param configType 配置类型
     * @param subjectType 科目类型
     * @param province 省份
     * @param year 年份
     * @return 分数值
     */
    Integer getScoreByConfigTypeAndSubjectTypeAndProvinceAndYear(String configType, String subjectType, String province, Integer year);

    /**
     * 刷新分数线配置缓存
     */
    void refreshScoreLineCache();

}